package juanca.mole;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import ClasesExtras.GetIpAddress;
import ClasesExtras.ManejadorCampos;
import ClasesExtras.ValidacionCampos;
import ClasesExtras.handlerAlertMessage;
import ClasesExtras.handlerDb;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import com.savagelook.android.JsonHelper;

public class ProductoEmpacado extends Activity {

	private Button btnanadeOtroRefe;
	private EditText etCantUnd;
	private Spinner spiReferencias;
	private String referencia;
	private String cantidad;
	public String proceso;
	private ManejadorCampos manejador;
	private handlerAlertMessage manejadorMensajes;
	private Activity activity;
	public ProductoEmpacado self = this;
	public handlerDb handlerdb = new handlerDb(this);
	private String URL_REGISTRO_PRODUCTO_TERMINADO;
	private String URL_REFERENCIAS_EMPAQUES;
	public ValidacionCampos validarcampos = new ValidacionCampos();
	public String parametrerdateElabora;
	public String parametrerdateVenc;
	public String parametrertemp_fin;
	public String parametrerobs;
	public Bundle b = new Bundle();
	public ProgressDialog progressDialog;

	
	// editado por alex ojo  
	
	private String URL_PRODUCTOS;
	private Spinner mostrarProducto;
	private String productoNueP;
	public String NombreProductoNueP;
	/**
	 * @return the productoNueP
	 */
	public String getProductoNueP() {
		return productoNueP;
	}

	/**
	 * @param productoNueP
	 *            the productoNueP to set
	 */
	public void setProductoNueP(String productoNueP) {
		this.productoNueP = productoNueP;
	}
	
	private HashMap<String, Integer> productoId;
	
	/// hasta aqui editado por alexx cuidado no sabe
	
	
	
	
	/**
	 * @return the cantidad
	 */
	public String getCantidad() {
		return cantidad;
	}

	/**
	 * @param cantidad
	 *            the cantidad to set
	 */
	public void setCantidad(String cantidad) {
		this.cantidad = cantidad;
	}

	/**
	 * @return the referencia
	 */
	public String getReferencia() {
		return referencia;
	}

	/**
	 * @param referencia
	 *            the referencia to set
	 */
	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_producto_empacado);

		getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		btnanadeOtroRefe = (Button) findViewById(R.id.btnanadeOtroRefe);
		etCantUnd = (EditText) findViewById(R.id.etCantUnd);
		mostrarProducto = (Spinner) findViewById(R.id.spiProdNueP);
		spiReferencias = (Spinner) findViewById(R.id.spiReferencias);
		manejadorMensajes = new handlerAlertMessage();
		manejador = new ManejadorCampos();
		activity = this;

	}

	@Override
	protected void onStart() {
		super.onStart();

		handlerDb db = new handlerDb(this);
		db.abrir();
		if (db.leerTabla4("actividad").equals("new")) {
			this.setTitle(this
					.getString(R.string.title_activity_producto_empacado)
					+ ". ("
					+ this.getString(R.string.msjDatosProcesoNumLote)
					+ ": "
					+ db.leer("nombre_lote")
					+ ", "
					+ this.getString(R.string.msjDatosProcesoProducto)
					+ ": "
					+ db.leer("nombre_producto") + ")");

		} else {
			this.setTitle(this
					.getString(R.string.title_activity_producto_empacado)
					+ ". ("
					+ this.getString(R.string.msjDatosProcesoNumLote)
					+ ": "
					+ db.leerTabla2("nombre_lote")
					+ ", "
					+ this.getString(R.string.msjDatosProcesoProducto)
					+ ": "
					+ db.leerTabla2("nombre_producto") + ")");
		}
		db.cerrar();
		
		final ProgressDialog pd = ProgressDialog.show(this, null,
				this.getString(R.string.PbMsjCargando), true, true);
		GetIpAddress direccion = new GetIpAddress(this);

		if (direccion.getDireccion() != null) {
			URL_PRODUCTOS = direccion.getDireccion() + "/productos.json";
			URL_REGISTRO_PRODUCTO_TERMINADO = direccion.getDireccion()
					+ "/productos_empacados.json";
			URL_REFERENCIAS_EMPAQUES = direccion.getDireccion()
					+ "/referencia_productos.json";

			new Thread(new Runnable() {
				@Override
				public void run() {
					self.mostrarReferencia(URL_REFERENCIAS_EMPAQUES);
					Log.i("EntregaMercancia", "carga Referencias");
					pd.dismiss();

				}
			}).start();
			new Thread(new Runnable() {
				@Override
				public void run() {
					self.mostrarProducto(URL_PRODUCTOS);
					Log.e("NuevoProceso", "carga productos");
					pd.dismiss();

				}
			}).start();

		} else {
			new AlertDialog.Builder(this)
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(R.string.tituloAlerta)
					.setMessage(R.string.msjErSinDireccion)
					.setPositiveButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {// un
								// listener que al pulsar, cierre la
								// aplicacion
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// Salir
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);
								}
							}).show();
		}
	}

	@Override
	protected void onResume() {
		super.onResume();

		b = this.getIntent().getBundleExtra("estado");
		this.parametrerdateElabora = b.getString("dateElabora");
		this.parametrerdateVenc = b.getString("dateVenc");
		this.parametrertemp_fin = b.getString("temp_fin");
		this.parametrerobs = b.getString("obs");

	}
	
	
///para mostrar productos en  ejo Editado por Alex

	
	/* Spinner de productos */
	public void mostrarProducto(String urlProductos) {

		productoId = new HashMap<String, Integer>();

		JSONObject productosJson = new JSONObject();
		JSONArray productosJsonArray;
		try {
			productosJsonArray = JsonHelper.getJsonArrayFromUrl(urlProductos);

			final ArrayAdapter<String> Lista_Productos = new ArrayAdapter<String>(
					this, android.R.layout.simple_spinner_item);

			if (productosJsonArray.length() != 0) {
				for (int j = 0; j < productosJsonArray.length(); j++) {
					productosJson = productosJsonArray.getJSONObject(j);
					Lista_Productos.add(productosJson.getString("nombre"));
					NombreProductoNueP = productosJson.getString("nombre");
					productoId.put(NombreProductoNueP,
							Integer.parseInt(productosJson.getString("id")));

				}

				runOnUiThread(new Runnable() {
					public void run() {
						Lista_Productos
								.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
						mostrarProducto.setAdapter(Lista_Productos);
					}
				});
			} else {
				
				
				/*
				 * hilo que muestra el mensaje de error de conexion al cargar
				 * los datos
				 */
				runOnUiThread(new Runnable() {
					public void run() {

						btnanadeOtroRefe.setEnabled(false);

						AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
								activity);
						mensajeEmergente
								.setIcon(android.R.drawable.ic_dialog_alert);
						mensajeEmergente.setTitle(R.string.tituloError);
						mensajeEmergente
						.setMessage(R.string.msjERNoHayProductos);
						mensajeEmergente.setNeutralButton(R.string.btnAceptar,
								new DialogInterface.OnClickListener() {

									public void onClick(DialogInterface dialog,
											int which) {
										Intent intent = new Intent();
										intent.setClass(activity, Etapas.class);
										startActivity(intent);

									}
								});

						mensajeEmergente.create();
						mensajeEmergente.show();
					}
				});
			
			}
			
			
			

		} catch (MalformedURLException e) {

			
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar
			 * los datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					btnanadeOtroRefe.setEnabled(false);

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente
							.setIcon(android.R.drawable.ic_dialog_alert);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
					.setMessage(R.string.msjERNoHayProductos);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
			
		} catch (JSONException e) {

			
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar
			 * los datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					btnanadeOtroRefe.setEnabled(false);

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente
							.setIcon(android.R.drawable.ic_dialog_alert);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
					.setMessage(R.string.msjERNoHayProductos);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		} catch (IOException e) {

			
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar
			 * los datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					btnanadeOtroRefe.setEnabled(false);

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente
							.setIcon(android.R.drawable.ic_dialog_alert);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
					.setMessage(R.string.msjERNoHayProductos);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

		catch (NullPointerException e) {

			
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar
			 * los datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					btnanadeOtroRefe.setEnabled(false);

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente
							.setIcon(android.R.drawable.ic_dialog_alert);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
					.setMessage(R.string.msjERNoHayProductos);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

	}

	
	
/// Hasta aquí mostrar productosss 
	
	
	
	
	// Spinner referencia de productos
	public void mostrarReferencia(String urlRef) {

		JSONObject ReferenciasObjet;
		JSONArray ReferenciasJsonArray;
		final ArrayList<String> referencias = new ArrayList<String>();

		try {
			ReferenciasJsonArray = JsonHelper.getJsonArrayFromUrl(urlRef);
			ReferenciasObjet = new JSONObject();

			if (ReferenciasJsonArray.length() != 0) {

				for (int i = 0; i < ReferenciasJsonArray.length(); i++) {

					ReferenciasObjet = ReferenciasJsonArray.getJSONObject(i);
					String ref = ReferenciasObjet.getString("nombre");
					referencias.add(ref);
				}

				runOnUiThread(new Runnable() {
					public void run() {
						ArrayAdapter<String> adapter = new ArrayAdapter<String>(
								self, android.R.layout.simple_spinner_item,
								referencias);
						adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
						spiReferencias.setAdapter(adapter);

					}
				});

			} else {

				/*
				 * hilo que muestra el mensaje de error de conexion al cargar
				 * los datos
				 */
				runOnUiThread(new Runnable() {
					public void run() {

						btnanadeOtroRefe.setEnabled(false);

						AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
								activity);
						mensajeEmergente
								.setIcon(android.R.drawable.ic_dialog_alert);
						mensajeEmergente.setTitle(R.string.tituloError);
						mensajeEmergente
								.setMessage(R.string.msjERNoHayReferenciasEmpaq);
						mensajeEmergente.setNeutralButton(R.string.btnAceptar,
								new DialogInterface.OnClickListener() {

									public void onClick(DialogInterface dialog,
											int which) {
										Intent intent = new Intent();
										intent.setClass(activity, Etapas.class);
										startActivity(intent);

									}
								});

						mensajeEmergente.create();
						mensajeEmergente.show();
					}
				});
			}

		} catch (Exception e) {
			Log.e("BuscaClientes",
					"Error al cargar las Referencias de empaques, Error: "
							+ e.fillInStackTrace());

			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
							.setMessage(R.string.msjERConexionCargarReferencias);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});

		}

	}

	// evento de los botones añadir y finalizar
	public void cantUnidades(View v) {
		int cant = manejador.validarPh(etCantUnd);

		if (cant != 0) {
			switch (cant) {
			case 17:
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjCantUnid,
						R.string.btnAceptar);
				break;
			}
		} else {

			this.setCantidad(this.etCantUnd.getText().toString());
			String Referencias = this.spiReferencias.getSelectedItem()
					.toString();
			Referencias = this.validarcampos.DeleteAccents(Referencias);
			this.setReferencia(Referencias);
			this.setProductoNueP(mostrarProducto.getSelectedItem()
					.toString());

			progressDialog = new ProgressDialog(self);
			progressDialog
					.setMessage(self.getString(R.string.PbMsjRegistrando));
			progressDialog.setCancelable(true);
			progressDialog.show();

			new Thread(new Runnable() {
				@Override
				public void run() {
					self.enviarDatos();
				}
			}).start();
		}
	}

	public void enviarDatos() {

		HttpClient httpClient = new DefaultHttpClient();
		HttpPost post = new HttpPost(URL_REGISTRO_PRODUCTO_TERMINADO);

		handlerDb dataBase = new handlerDb(this);
		dataBase.abrir();
		String IdProcesoTabla1 = dataBase.leer("id_proceso");
		String IdProcesoTabla2 = dataBase.leerTabla2("id_proceso");
		//String idproductoTabla1 = dataBase.leer("id_producto");
		
		//editado por alex ojo
		
		//String idproductoTabla1 = dataBase.leer("id_producto");
		
		// editado por alex
		
		
		//String idproductoTabla2 = dataBase.leerTabla2("id_producto");
		try {
			Log.i("ProductoEmpacado", "entra al Try de envio de datos");
			JSONObject dato = new JSONObject();
			dato.put("cantidad", this.getCantidad());
			dato.put("referencia", this.getReferencia());
			if (dataBase.leerTabla4("actividad").equals("new")) {

				dato.put("proceso_id", IdProcesoTabla1);
				//dato.put("producto_id", idproductoTabla1);
				//editado por alex
				dato.put("producto_id", productoId.get(this.getProductoNueP()));
				//fin editado por alex ojo
				
				proceso = IdProcesoTabla1;

			} else {
				if (dataBase.leerTabla4("actividad").equals("old")) {
					dato.put("proceso_id", IdProcesoTabla2);
					//dato.put("producto_id", idproductoTabla2);
					
					//editado por alex
					dato.put("producto_id", productoId.get(this.getProductoNueP()));
					//fin editado por alex ojo
					
					proceso = IdProcesoTabla2;
				}
			}
			StringEntity entity = new StringEntity(dato.toString());
			post.setHeader("Content-Type", "application/json; chartset=UTF-8");
			post.setEntity(entity);
			HttpResponse resp = httpClient.execute(post);
			final String respStr = EntityUtils.toString(resp.getEntity());
			Log.w("ProductoEmpacado", respStr);

			if (respStr.equals("true")) {
				Log.i("ProductoEmpacado", "el servidor me retorno true");
				Log.e("ProductoEmpacado", "esta antes del hilo de msj exitoso");

				handlerdb.abrir();
				if (handlerdb.leerTabla6("chequeo").equals("false")) {
					int resDbTb6 = handlerdb.eliminarTabla6();
					if (resDbTb6 == 1) {
						handlerdb.registrarTabla6("true");
					}
				}
				handlerdb.cerrar();
				// mensaje de respuesta del servidor
				runOnUiThread(new Runnable() {
					public void run() {
						progressDialog.dismiss();
						self.etCantUnd.setText(null);
						Context contexto = self.getApplicationContext();
						CharSequence texto = self
								.getString(R.string.msjSeAgrego)
								+ " "
								+ self.getCantidad()
								+ " "
								+ self.getString(R.string.msjUnidades)
								+ " "
								+ self.getString(R.string.msjEnLaRef)
								+ " "
								+ self.getReferencia();
						int duracion = Toast.LENGTH_LONG;
						Toast toast = Toast.makeText(contexto, texto, duracion);
						toast.show();

						Log.e("ProductoEmpacado",
								"el servidor me retorno true y esta en el mensaje en pantalla");

					}
				});
			} else {
				runOnUiThread(new Runnable() {
					public void run() {

						progressDialog.dismiss();
						AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
								activity);
						mensajeEmergente.setTitle(R.string.tituloError);
						mensajeEmergente.setMessage(respStr);
						mensajeEmergente.setNeutralButton(R.string.btnAceptar,
								null);
						mensajeEmergente.create();
						mensajeEmergente.show();
						Log.e("ProductoEmpacado",
								"el servidor no retorno true y esta en el mensaje en pantalla");
					}
				});

			}

		} catch (Exception e) {
			Log.e("ProductoEmpacado", "me salta al catch y no termina el TRY");
			Log.e("ProductoEmpacado", e.toString());

			progressDialog.dismiss();
			// mensaje de respuesta del servidor
			runOnUiThread(new Runnable() {
				public void run() {
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloError, R.string.msjERConexionEnviar,
							R.string.btnAceptar);

				}
			});
		}
		dataBase.cerrar();
	}

	// método que lo lleva a la vista de trazabilidad
	public void goTrazabilidad(View view) {
		if (proceso != null) {

			Intent intent = new Intent();
			intent.setClass(self, Trazabilidad.class);
			b = new Bundle();
			b.putString("dateElabora", this.parametrerdateElabora);
			b.putString("dateVenc", this.parametrerdateVenc);
			b.putString("temp_fin", this.parametrertemp_fin);
			b.putString("obs", this.parametrerobs);
			b.putString("numLote", proceso);
			intent.putExtra("clave", b);
			self.startActivity(intent);
		} else {
			manejadorMensajes.alertMessageOneButton(activity,
					R.string.tituloError, R.string.msjERMinimoUnPt,
					R.string.btnAceptar);
		}
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {

		if (keyCode == KeyEvent.KEYCODE_BACK) {

			// Salir
			Intent intent = new Intent();
			intent.setClass(activity, Trazabilidad.class);
			startActivity(intent);
			return true;

		}
		// para las demas cosas, se reenvia el evento al listener habitual
		return super.onKeyUp(keyCode, event);
	}
}
